/*
 *   Copyright (C) 2012  Jens Kieselbach
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You may obtain a copy of the License at http://www.gnu.org/licenses/gpl.html
 */

package de.kieselbach.circles

import javafx.animation.KeyFrame
import javafx.animation.KeyValue
import javafx.animation.Timeline
import javafx.application.Application
import javafx.scene.Group
import javafx.scene.Node
import javafx.scene.Scene
import javafx.scene.effect.BlendMode
import javafx.scene.effect.BoxBlur
import javafx.scene.paint.Color
import javafx.scene.paint.CycleMethod
import javafx.scene.paint.LinearGradient
import javafx.scene.paint.Stop
import javafx.scene.shape.Circle
import javafx.scene.shape.Rectangle
import javafx.scene.shape.StrokeType
import javafx.stage.Stage
import javafx.util.Duration

class ColorfulCircles extends Application {

    static void main(String[] args) {

        Application.launch(ColorfulCircles.class, args)
    }

    @Override
    void start(Stage primarystage) {

        Group root = new Group()
        Scene scene = new Scene(root, 800, 600, Color.BLACK)
        primarystage.scene = scene

        Group circles = new Group()
        circles.effect = new BoxBlur(10, 10, 3)
        for (i in 0..9) {
            Circle circle = new Circle(150, Color.web("white", 0.05))
            circle.setStrokeType(StrokeType.OUTSIDE)
            circle.setStroke(Color.web("white", 0.16))
            circle.setStrokeWidth(4)
            circles.getChildren().add(circle)
        }

        Stop[] stops = [
            new Stop(0, Color.web("#f8bd55")),
            new Stop(0.14, Color.web("#c0fe56")),
            new Stop(0.28, Color.web("#5dfbc1")),
            new Stop(0.43, Color.web("#64c2f8")),
            new Stop(0.57, Color.web("#be4af7")),
            new Stop(0.71, Color.web("#ed5fc2")),
            new Stop(0.85, Color.web("#ef504c")),
            new Stop(1, Color.web("#f2660f")),
        ]
        Rectangle colors = new Rectangle(scene.getWidth(), scene.getHeight(),
            new LinearGradient(0f, 1f, 1f, 0f, true, CycleMethod.NO_CYCLE, stops)
        )

        Group blendModeGroup = new Group(new Group(new Rectangle(scene.getWidth(), scene.getHeight(), Color.BLACK), circles), colors)
        colors.setBlendMode(BlendMode.OVERLAY)

        root.getChildren().add(blendModeGroup)

        Timeline timeline = new Timeline()
        for (Node circle: circles.getChildren()) {
            timeline.getKeyFrames().addAll(
                    new KeyFrame(Duration.ZERO, // set start position at 0
                            new KeyValue(circle.translateXProperty(), Math.random() * 800),
                            new KeyValue(circle.translateYProperty(), Math.random() * 600)
                    ),
                    new KeyFrame(new Duration(20000), // set end position at 40s
                            new KeyValue(circle.translateXProperty(), Math.random() * 800),
                            new KeyValue(circle.translateYProperty(), Math.random() * 600)
                    )
            )
        }

        timeline.play()

        primarystage.show()
    }
}
